//给定一个 n × n 的二维矩阵表示一个图像。 
//
// 将图像顺时针旋转 90 度。 
//
// 说明： 
//
// 你必须在原地旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 
//
// 示例 1: 
//
// 给定 matrix = 
//[
//  [1,2,3],
//  [4,5,6],
//  [7,8,9]
//],
//
//原地旋转输入矩阵，使其变为:
//[
//  [7,4,1],
//  [8,5,2],
//  [9,6,3]
//]
// 
//
// 示例 2: 
//
// 给定 matrix =
//[
//  [ 5, 1, 9,11],
//  [ 2, 4, 8,10],
//  [13, 3, 6, 7],
//  [15,14,12,16]
//], 
//
//原地旋转输入矩阵，使其变为:
//[
//  [15,13, 2, 5],
//  [14, 3, 4, 1],
//  [12, 6, 8, 9],
//  [16, 7,10,11]
//]
// 
// Related Topics 数组 
// 👍 617 👎 0

package leetcode.editor.cn;

import common.util.MyUtil;

/**
 * Java：旋转图像
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P48_RotateImage {
    public static void main(String[] args) {
        Solution solution = new P48_RotateImage().new Solution();
        int[][] matrix = {
                {18, 0, 20, 25, 100},
                {15, 13, 2, 5, 101},
                {14, 3, 4, 1, 102},
                {12, 6, 8, 9, 103},
                {16, 7, 10, 11, 104}
        };
        solution.rotate(matrix);
        for (int i = 0; i < matrix.length; i++) {
            MyUtil.printInt(matrix[i]);
        }

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public void rotate(int[][] matrix) {
            if (matrix == null) {
                return;
            }
            // 确定是n*n的矩阵
            int length = matrix.length;
            if (length != matrix[0].length) {
                return;
            }
            for (int i = 0; i < length / 2; i++) {
                for (int j = i; j < length - i - 1; j++) {
                    // 开始倒序替换，就是最后一个替换第一个
                    // (i,j) -> (j, length-1-i) -> (length-1-i, length-1-j) -> (length-1-j, i)
                    swap(matrix, i, j, length - 1 - j, i);
                    swap(matrix, length - 1 - j, i, length - 1 - i, length - 1 - j);
                    swap(matrix, length - 1 - i, length - 1 - j, j, length - 1 - i);
                }
            }
        }

        /**
         * 交换二维数组两个元素
         *
         * @param matrix 二维数组
         */
        private void swap(int[][] matrix, int i1, int j1, int i2, int j2) {
            int temp = matrix[i1][j1];
            matrix[i1][j1] = matrix[i2][j2];
            matrix[i2][j2] = temp;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}